package database;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

import comun.Constantes.tablas;

import domain.*;

public class DBGestor {

	private DBaccess abd;

	public DBGestor() {
		abd = DBaccess.getInstance();
	}

	public Set<Pelicula> consultarPeliculas() {

		Set<Pelicula> retorno = new HashSet<Pelicula>();

		abd.establecerConexion();

		try {
			ResultSet rs = abd.leerTodo("PELICULAS");

			while (rs.next()) {
				String titulo = rs.getString("TITULO");
				String autor = rs.getString("AUTOR");
				int ano = rs.getInt("ANO");
				int duracion = rs.getInt("DURACION");
				String descripcion = rs.getString("DESCRIPCION");
				double precioAlquiler = rs.getDouble("PALQUILER");
				double precioCompra = rs.getDouble("PCOMPRA");
				String formato = rs.getString("FORMATO");
				double valoracion = rs.getDouble("VALORACION");
				String estado = rs.getString("ESTADO");
				int id = rs.getInt("ID");
				int numeroV = rs.getInt("NVALORACIONES");
				double puntuacionSuma = rs.getDouble("SUMA");

				Pelicula pelicula = new Pelicula(titulo, autor, ano, duracion,
						descripcion, formato, precioAlquiler, precioCompra,
						valoracion, estado, id, numeroV, puntuacionSuma);

				retorno.add(pelicula);

			}
		} catch (SQLException e) {

		}

		abd.cerrarConexion();
		return retorno;
	}

	public ArrayList<Pelicula> consultarPeliculasOrdenadas() {

		ArrayList<Pelicula> retorno = new ArrayList<Pelicula>();

		abd.establecerConexion();

		try {
			ResultSet rs = abd.leerOrdenar("PELICULAS", "VALORACION");

			while (rs.next()) {
				String titulo = rs.getString("TITULO");
				String autor = rs.getString("AUTOR");
				int ano = rs.getInt("ANO");
				int duracion = rs.getInt("DURACION");
				String descripcion = rs.getString("DESCRIPCION");
				double precioAlquiler = rs.getDouble("PALQUILER");
				double precioCompra = rs.getDouble("PCOMPRA");
				String formato = rs.getString("FORMATO");
				double valoracion = rs.getDouble("VALORACION");
				String estado = rs.getString("ESTADO");
				int id = rs.getInt("ID");
				int numeroV = rs.getInt("NVALORACIONES");
				double puntuacionSuma = rs.getDouble("SUMA");

				Pelicula pelicula = new Pelicula(titulo, autor, ano, duracion,
						descripcion, formato, precioAlquiler, precioCompra,
						valoracion, estado, id, numeroV, puntuacionSuma);

				retorno.add(pelicula);

			}
		} catch (SQLException e) {

		}

		abd.cerrarConexion();
		return retorno;
	}

	public Map<String, AlquilerPeliculas> consultarAlquileresPeliculas() {

		Map<String, AlquilerPeliculas> retorno = new HashMap<String, AlquilerPeliculas>();

		abd.establecerConexion();

		try {
			ResultSet rs = abd.leerTodo("ALQUILER_PELICULAS");

			while (rs.next()) {
				int id_alquiler = rs.getInt("ID_ALQUILER");
				int id_usuario = rs.getInt("ID_USUARIO");
				int id_producto = rs.getInt("ID_PRODUCTO");
				String estado = rs.getString("ESTADO");

				AlquilerPeliculas alquiler_peli = new AlquilerPeliculas(
						id_alquiler, id_producto, id_usuario, estado);

				retorno.put(Integer.toString(id_alquiler), alquiler_peli);

			}
		} catch (SQLException e) {

		}

		abd.cerrarConexion();
		return retorno;
	}

	public Map<String, FavoritoPelicula> consultarMisFavoritoPeliculas(int id_u) {

		Map<String, FavoritoPelicula> retorno = new HashMap<String, FavoritoPelicula>();

		abd.establecerConexion();

		String condicion = "ID_USUARIO = " + id_u;
		try {
			ResultSet rs = abd.leerMisFavoritos("FAVORITOS_PELICULAS",
					condicion);

			while (rs.next()) {
				int id_f = rs.getInt("ID_FAVORITO");
				int id_usuario = rs.getInt("ID_USUARIO");
				int id_producto = rs.getInt("ID_PRODUCTO");

				FavoritoPelicula fav_P = new FavoritoPelicula(id_producto,
						id_usuario, id_f);

				retorno.put(Integer.toString(id_f), fav_P);

			}
		} catch (SQLException e) {

		}

		abd.cerrarConexion();
		return retorno;
	}

	public Map<String, FavoritoPelicula> consultarFavoritoPeliculas() {

		Map<String, FavoritoPelicula> retorno = new HashMap<String, FavoritoPelicula>();

		abd.establecerConexion();

		try {
			ResultSet rs = abd.leerTodo("FAVORITOS_PELICULAS");

			while (rs.next()) {
				int id_f = rs.getInt("ID_FAVORITO");
				int id_usuario = rs.getInt("ID_USUARIO");
				int id_producto = rs.getInt("ID_PRODUCTO");

				FavoritoPelicula fav_P = new FavoritoPelicula(id_producto,
						id_usuario, id_f);

				retorno.put(Integer.toString(id_f), fav_P);

			}
		} catch (SQLException e) {

		}

		abd.cerrarConexion();
		return retorno;
	}

	public Set<CD> consultarCDs() {

		Set<CD> retorno = new HashSet<CD>();

		abd.establecerConexion();

		try {
			ResultSet rs = abd.leerTodo("CDS");

			while (rs.next()) {
				String titulo = rs.getString("TITULO");
				String autor = rs.getString("AUTOR");
				int ano = rs.getInt("ANO");
				int duracion = rs.getInt("DURACION");
				String descripcion = rs.getString("DESCRIPCION");
				double precioAlquiler = rs.getDouble("PALQUILER");
				double precioCompra = rs.getDouble("PCOMPRA");
				int nCanciones = rs.getInt("NCANCIONES");
				double valoracion = rs.getDouble("VALORACION");
				String estado = rs.getString("ESTADO");
				int id = rs.getInt("ID");
				int numeroV = rs.getInt("NVALORACIONES");
				double puntuacionSuma = rs.getDouble("SUMA");

				CD cd = new CD(titulo, autor, ano, duracion, descripcion,
						nCanciones, precioAlquiler, precioCompra, valoracion,
						estado, id, numeroV, puntuacionSuma);

				retorno.add(cd);

			}
		} catch (SQLException e) {

		}

		abd.cerrarConexion();
		return retorno;
	}

	public ArrayList<CD> consultarCDOrdenadas() {

		ArrayList<CD> retorno = new ArrayList<CD>();

		abd.establecerConexion();

		try {
			ResultSet rs = abd.leerOrdenar("CDS", "VALORACION");

			while (rs.next()) {
				String titulo = rs.getString("TITULO");
				String autor = rs.getString("AUTOR");
				int ano = rs.getInt("ANO");
				int duracion = rs.getInt("DURACION");
				String descripcion = rs.getString("DESCRIPCION");
				double precioAlquiler = rs.getDouble("PALQUILER");
				double precioCompra = rs.getDouble("PCOMPRA");
				int nCanciones = rs.getInt("NCANCIONES");
				double valoracion = rs.getDouble("VALORACION");
				String estado = rs.getString("ESTADO");
				int id = rs.getInt("ID");
				int numeroV = rs.getInt("NVALORACIONES");
				double puntuacionSuma = rs.getDouble("SUMA");

				CD cd = new CD(titulo, autor, ano, duracion, descripcion,
						nCanciones, precioAlquiler, precioCompra, valoracion,
						estado, id, numeroV, puntuacionSuma);

				retorno.add(cd);

			}
		} catch (SQLException e) {

		}

		abd.cerrarConexion();
		return retorno;
	}

	public Map<String, AlquilerCDs> consultarAlquileresCDs() {

		Map<String, AlquilerCDs> retorno = new HashMap<String, AlquilerCDs>();

		abd.establecerConexion();

		try {
			ResultSet rs = abd.leerTodo("ALQUILER_CDS");

			while (rs.next()) {
				int id_alquiler = rs.getInt("ID_ALQUILER");
				int id_usuario = rs.getInt("ID_USUARIO");
				int id_producto = rs.getInt("ID_PRODUCTO");
				String estado = rs.getString("ESTADO");

				AlquilerCDs alquiler_cd = new AlquilerCDs(id_alquiler,
						id_producto, id_usuario, estado);

				retorno.put(Integer.toString(id_alquiler), alquiler_cd);

			}
		} catch (SQLException e) {

		}

		abd.cerrarConexion();
		return retorno;
	}

	public Map<String, FavoritoCD> consultarFavoritoCDs() {

		Map<String, FavoritoCD> retorno = new HashMap<String, FavoritoCD>();

		abd.establecerConexion();

		try {
			ResultSet rs = abd.leerTodo("FAVORITOS_CDS");

			while (rs.next()) {
				int id_f = rs.getInt("ID_FAVORITO");
				int id_usuario = rs.getInt("ID_USUARIO");
				int id_producto = rs.getInt("ID_PRODUCTO");

				FavoritoCD fav_CD = new FavoritoCD(id_producto, id_usuario,
						id_f);

				retorno.put(Integer.toString(id_f), fav_CD);

			}
		} catch (SQLException e) {

		}

		abd.cerrarConexion();
		return retorno;
	}

	public Map<String, Usuario> consultarUsuarios() {

		abd.establecerConexion();

		Map<String, Usuario> retorno;
		retorno = new HashMap<String, Usuario>();
		try {
			ResultSet rs = abd.leerTodo("USUARIOS");

			while (rs.next()) {
				String nombre = rs.getString("NOMBRE");
				String apellido = rs.getString("APELLIDO");
				String dni = rs.getString("DNI");
				int telefono = rs.getInt("TELEFONO");
				String fechaNacimiento = rs.getString("FECHA_NACIMIENTO");
				String username = rs.getString("USERNAME");
				String password = rs.getString("PASSWORD");
				double saldo = rs.getDouble("SALDO");
				int id = rs.getInt("ID");
				Usuario usuario = new Usuario(id, nombre, apellido, dni,
						fechaNacimiento, telefono, username, password, saldo);

				retorno.put(Integer.toString(id), usuario);

			}
		} catch (SQLException e) {

		}

		abd.cerrarConexion();
		return retorno;

	}

	public void guardarPelicula(Pelicula P) {
		abd.establecerConexion();

		String guardarP = "INSERT INTO PELICULAS VALUES ('" + P.getTitulo()
				+ "', '" + P.getAutor() + "','" + P.getDescripcion() + "','"
				+ P.getEstado() + "'," + P.getAno() + "," + P.getDuracion()
				+ "," + P.getNumeroValoraciones() + ",'" + P.getFormato()
				+ "'," + P.getId_producto() + "," + P.getPrecioAlquiler() + ","
				+ P.getPrecioCompra() + "," + P.getPuntuacion() + ","
				+ P.getPuntuacionSuma() + ");";
		try {

			abd.insertar(guardarP);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		abd.cerrarConexion();
	}

	public void guardarCD(CD C) {
		abd.establecerConexion();

		String guardarCD = "INSERT INTO CDS VALUES ('" + C.getTitulo() + "', '"
				+ C.getAutor() + "'," + C.getAno() + "," + C.getDuracion()
				+ ",'" + C.getDescripcion() + "'," + C.getNumeroCanciones()
				+ "," + C.getPrecioAlquiler() + "," + C.getPrecioCompra() + ","
				+ C.getPuntuacion() + ",'" + C.getEstado() + "',"
				+ C.getId_producto() + "," + C.getNumeroValoraciones() + ","
				+ C.getPuntuacionSuma() + ");";

		try {

			abd.insertar(guardarCD);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		abd.cerrarConexion();
	}

	public void anadirUsuario(Usuario U) {
		abd.establecerConexion();

		String guardarU = "INSERT INTO USUARIOS VALUES (" + U.getId() + ", '"
				+ U.getNombre() + "','" + U.getApellido() + "','" + U.getDni()
				+ "','" + U.getFechaNacimiento() + "'," + U.getTelefono()
				+ ",'" + U.getUsername() + "','" + U.getPassword() + "',"
				+ U.getSaldo() + ");";

		try {

			abd.insertar(guardarU);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		abd.cerrarConexion();
	}

	public void anadirAlquilerPelicula(AlquilerPeliculas A) {
		abd.establecerConexion();

		String guardarA = "INSERT INTO ALQUILER_PELICULAS VALUES ("
				+ A.getId_alquiler() + ", '" + A.getFecha() + "',"
				+ A.getId_usuario() + "," + A.getId_producto() + ",'"
				+ A.getEstado() + "');";

		try {

			abd.insertar(guardarA);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		abd.cerrarConexion();
	}

	public void anadirAlquilerCD(AlquilerCDs A) {
		abd.establecerConexion();

		String guardarA = "INSERT INTO ALQUILER_CDS VALUES ("
				+ A.getId_alquiler() + ", '" + A.getFecha() + "',"
				+ A.getId_usuario() + "," + A.getId_producto() + ",'"
				+ A.getEstado() + "');";

		try {

			abd.insertar(guardarA);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		abd.cerrarConexion();
	}

	public void anadirFavoritoCD(FavoritoCD F) {
		abd.establecerConexion();

		String guardarF = "INSERT INTO FAVORITOS_CDS VALUES ( "
				+ F.getId_usuario() + "," + F.getId_producto() + ","
				+ F.getId_favorito() + ");";

		try {

			abd.insertar(guardarF);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		abd.cerrarConexion();
	}

	public void anadirFavoritoPelicula(FavoritoPelicula F) {
		abd.establecerConexion();

		String guardarF = "INSERT INTO FAVORITOS_PELICULAS VALUES ( "
				+ F.getId_usuario() + "," + F.getId_producto() + ","
				+ F.getId_favorito() + ");";

		try {

			abd.insertar(guardarF);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		abd.cerrarConexion();
	}

	public void eliminarCD() {
		// TODO Auto-generated method stub
		abd.establecerConexion();
		try {

			abd.borrar(tablas.CDS);
		} catch (SQLException e) {

		}
		abd.cerrarConexion();
	}

	public void eliminarPelicula() {
		// TODO Auto-generated method stub
		abd.establecerConexion();
		try {

			abd.borrar(tablas.PELICULAS);
		} catch (SQLException e) {

		}
		abd.cerrarConexion();
	}

	public void eliminarUsuario() {
		// TODO Auto-generated method stub
		abd.establecerConexion();
		try {
			abd.borrar(tablas.USUARIOS);
		} catch (SQLException e) {

		}
		abd.cerrarConexion();
	}

	public void modificarPelicula(String key, Pelicula p) {
		// TODO Auto-generated method stub

		abd.establecerConexion();

		String condicion = " ID = " + key;
		String nuevosValores = "TITULO = '" + p.getTitulo() + "', AUTOR = '"
				+ p.getAutor() + "' , DESCRIPCION = '" + p.getDescripcion()
				+ "',ESTADO = '" + p.getEstado() + "' , ANO = " + p.getAno()
				+ ",DURACION = " + p.getDuracion() + " , NVALORACIONES = "
				+ p.getNumeroValoraciones() + ", FORMATO = '" + p.getFormato()
				+ "' , ID = " + p.getId_producto() + ",PALQUILER = "
				+ p.getPrecioAlquiler() + " , PCOMPRA = " + p.getPrecioCompra()
				+ ",VALORACION = " + p.getPuntuacion() + " , SUMA = "
				+ p.getPuntuacionSuma() + "";

		try {
			abd.actualizar(tablas.PELICULAS, nuevosValores, condicion);
		} catch (SQLException e) {

		}

		abd.cerrarConexion();

	}

	public void modificarCD(String key, CD p) {
		// TODO Auto-generated method stub
		abd.establecerConexion();

		String condicion = " ID = " + key;
		String nuevosValores = "TITULO = '" + p.getTitulo() + "', AUTOR = '"
				+ p.getAutor() + "' , ANO = " + p.getAno() + ",DURACION = "
				+ p.getDuracion() + ", DESCRIPCION = '" + p.getDescripcion()
				+ "',NCANCIONES = " + p.getNumeroCanciones() + ",PALQUILER = "
				+ p.getPrecioAlquiler() + " , PCOMPRA = " + p.getPrecioCompra()
				+ ",VALORACION = " + p.getPuntuacion() + ",ESTADO = '"
				+ p.getEstado() + "' , ID = " + p.getId_producto()
				+ " , NVALORACIONES = " + p.getNumeroValoraciones()
				+ " , SUMA = " + p.getPuntuacionSuma() + "";

		try {
			abd.actualizar(tablas.CDS, nuevosValores, condicion);
		} catch (SQLException e) {

		}

		abd.cerrarConexion();
	}

	public void modificarUsuario(String key, Usuario u) {
		abd.establecerConexion();

		String condicion = " ID = " + key;
		String nuevosValores = "ID = " + u.getId() + ", NOMBRE = '"
				+ u.getNombre() + "' , APELLIDO = '" + u.getApellido()
				+ "',DNI = '" + u.getDni() + "' , FECHA_NACIMIENTO = '"
				+ u.getFechaNacimiento() + "',TELEFONO = " + u.getTelefono()
				+ ",USERNAME = '" + u.getUsername() + "',PASSWORD = '"
				+ u.getPassword() + "',SALDO = " + u.getSaldo() + "";

		try {
			abd.actualizar(tablas.USUARIOS, nuevosValores, condicion);
		} catch (SQLException e) {

		}

		abd.cerrarConexion();

	}

	public void modificarAlquilerPeliculas(String key, AlquilerPeliculas u) {
		// TODO Auto-generated method stub

		abd.establecerConexion();

		String condicion = " ID_ALQUILER = " + key;
		String nuevosValores = "ID_ALQUILER = " + u.getId_alquiler()
				+ ", FECHA = '" + u.getFecha() + "' , ID_USUARIO = "
				+ u.getId_usuario() + ",ID_PRODUCTO = " + u.getId_producto()
				+ " , ESTADO = '" + u.getEstado() + "'";

		try {
			abd.actualizar(tablas.ALQUILER_PELICULAS, nuevosValores, condicion);
		} catch (SQLException e) {

		}

		abd.cerrarConexion();
	}

	public void modificarAlquilerCDs(String key, AlquilerCDs u) {
		// TODO Auto-generated method stub
		abd.establecerConexion();

		String condicion = " ID_ALQUILER = " + key;
		String nuevosValores = "ID_ALQUILER = " + u.getId_alquiler()
				+ ", FECHA = '" + u.getFecha() + "' , ID_USUARIO = "
				+ u.getId_usuario() + ",ID_PRODUCTO = " + u.getId_producto()
				+ " , ESTADO = '" + u.getEstado() + "'";

		try {
			abd.actualizar(tablas.ALQUILER_CDS, nuevosValores, condicion);
		} catch (SQLException e) {

		}

		abd.cerrarConexion();

	}

	public void modificarFavoritoPelicula(String key, FavoritoPelicula u) {
		// TODO Auto-generated method stub
		abd.establecerConexion();

		String condicion = " ID_FAVORITO = " + key;
		String nuevosValores = "ID_USUARIO = " + u.getId_usuario()
				+ ",ID_PRODUCTO = " + u.getId_producto() + " , ID_FAVORITO = "
				+ u.getId_favorito() + "";

		try {
			abd.actualizar(tablas.FAVORITOS_PELICULAS, nuevosValores, condicion);
		} catch (SQLException e) {

		}

		abd.cerrarConexion();
	}

	public void modificarFavoritoCDs(String key, FavoritoCD u) {
		// TODO Auto-generated method stub

		abd.establecerConexion();

		String condicion = " ID_FAVORITO = " + key;
		String nuevosValores = "ID_USUARIO = " + u.getId_usuario()
				+ ",ID_PRODUCTO = " + u.getId_producto() + " , ID_FAVORITO = "
				+ u.getId_favorito() + "";

		try {
			abd.actualizar(tablas.FAVORITOS_CDS, nuevosValores, condicion);
		} catch (SQLException e) {

		}

		abd.cerrarConexion();
	}

}
